package 启蒙阶段;

import java.util.Scanner;

/**
 * 创建人：刘源江
 * 类描述：
 * 创建时间：2022/5/6 0:35
 **/

public class demo19面向对象三大特征之多态 {
    public static void main(String[] args) {
        //多态：是指同一行为，具有多个不同表现形式(状态)
        //用非静态方法来描述多态中的状态
        //为了保证多种状态，父类状态必须有，子类状态可有可无(因为子类可以继承父类状态)
        //一个父亲可以代表多个儿子的状态，提高代码的复用性，扩展性(对于将来的儿子也适用)，维护性

//        Animal animal = new Cat();//本来走的是父类的状态，但是走了子类的状态，说明出现了多种状态(多态)
        Cat cat = new Cat();
        Dog dog = new Dog();
        method(cat);
        method(dog);

        //向上转型
//        Animal a = new Cat();
        Animal a = new Dog();
        a.method();

        //向下转型
//        Cat d = (Cat) a;
//        d.SpecialOne();

        //为了防止乱强转，用instanceof关键字来判断是什么类型东西
        if (a instanceof Cat){
            Cat b = (Cat) a;
            b.SpecialOne();
        }else if (a instanceof Dog){
            Dog c = (Dog) a;
            c.SpecialTwo();
        }

    }

    //1. 参数多态：写一个方法来调用两个子类的状态
    public static void method(Animal a){
        a.method();
    }

    //2. 返回值多态
    public static Animal method2(){
        Scanner sc = new Scanner(System.in);
        int i = sc.nextInt();

        if (i == 1){
            Cat cat = new Cat();
            return cat;
        }else if (i == 2){
            Dog dog = new Dog();
            return dog;
        }
        return null;
    }
}

class Animal{
    public void method(){
        System.out.println("父类的状态");
    }
}

class Cat extends Animal{
    //子类的共有功能
    public void method(){
        System.out.println("子类的第一种状态");
    }

    //子类的特有功能，向下转型进行调用
    public void SpecialOne(){
        System.out.println("吃鱼");
    }
}

class Dog extends Animal{
    public void method(){
        System.out.println("子类的第二种状态");
    }

    //子类的特有功能，向下转型进行调用
    public void SpecialTwo(){
        System.out.println("看家");
    }
}
